" Configurações padrões {{{1

source ~/.config/nvim/plugins.vim
syntax on                 " Habilita sistema de destaques de código (highlighting)
filetype plugin indent on " Habilita carregar plugins baseados em extensão
scriptencoding utf-8      " Seleciona utf8 como codificação padrão

" ------------------------------------------------------------------------------
" Tema {{{2

" colorscheme gruvbox
set background=dark " Permite temas escolherem cores para um fundo mais escuro
" set termguicolors
colorscheme gotham

if $TERM =~ "xst"
  set termguicolors
endif

" }}}
" ------------------------------------------------------------------------------

set hidden
set nojoinspaces               " Apenas insere um único espaço depois de '.', '!' e '?'
set report=0                   " Sempre exibir o número de linhas copiados ou apagados na linha de mensagem
set backspace=indent,eol,start " Compatibilidade com vim classico para backspace
set clipboard=unnamedplus      " O registrador * vira unnamed, permite que os textos copiados pelo vim vão para o clipboard
set shada="NONE"

" ------------------------------------------------------------------------------
" Desativar 'press ENTER to continue' {{{2

set cmdheight=1  " Número de linhas para a linha de comando.
set shortmess+=c " Trunca quase todos os textos de comandos evitando o pressione ENTER para continuar

" }}}
" ------------------------------------------------------------------------------

" ------------------------------------------------------------------------------
" Visual {{{2

set fillchars+=vert:\
set number            " Mostrar os números das linhas
set relativenumber    " Mostrar os números relativos
set splitbelow        " Novas janelas serão colocadas em baixo da atual se o split for horizontal
set splitright        " Novas janelas serão colocadas ao lado direito da atual se o split for vertical
set list              " Mostra caracteres invisíveis
set listchars=tab:→\ ,eol:¬,trail:·,extends:❯,precedes:❮,nbsp:␣

" }}}
" ------------------------------------------------------------------------------

set guicursor=
" set guicursor=n-v-c:block,i-ci-ve:ver25,r-cr:hor20,o:hor50
"        \,a:blinkwait700-blinkoff400-blinkon250-Cursor/lCursor
"        \,sm:block-blinkwait175-blinkoff150-blinkon175

set nocompatible
set completeopt+=noselect " TODO
set diffopt+=context:4,vertical " TODO
set equalprg=par\ -r " Nome do programa externo que será utilizado para formatar linhas usando o operator =

" ------------------------------------------------------------------------------
" Visual {{{2

set magic      " Ativa magic para expressões regulares
set gdefault   " Pesquisa e substituição são globais por linha
set autoread   " Detecta quando um arquivo é editado
set incsearch  " Mostra enquanto digita
set smartcase  " Se a busca contiver letras maiúsculas, a pesqusa passa a ser case-sensitive
set ignorecase " As pesquisas viram case-insensitive

set nobackup   " Desabilita backups
set noswapfile " Desabilita swaps
set noundofile " Desabilita arquivos de undo
set fileencoding=utf-8 " Arquivos serão no formato utf-8
set fileformat=unix " Novas linhas no formato LF apenas
set formatprg=par\ -r " Nome do programa externo que será utilizado para formatar linhas usando o operador gc
set history=100 " Histórico contém no máximo cem comandos
set inccommand=nosplit " Mostra a substituição de texto enquanto você digita
set linebreak " Quebra simples de texto, não insere nova linha
set matchtime=0 " Quantos décimos de segundos ele demora para mostrar o parenteses correspondente
set scrolloff=3 " Número mínimo de linhas à manter acima ou abaixo do cursor
set showbreak=↪ " Mostra o caractere quando quebra a linha
"set textwidth=120 " Tamanho máximo do texto que deve ser inserido. Uma linha maior será quebrada depois do primeiro espaço em branco
set timeout
set ttimeoutlen=50
set timeoutlen=200 " Tempo em milisegundos à esperar para uma sequência mapeada para completar
set title " Permite alterar o título do terminal
set wildignore=*\\tmp\\*,*.swp,*.zip,*.exe,*.tmp,.DS_Store " Lista de padrões para ignorar no autocomplete
set wildmode=longest,list,full " Completa arquivos como um terminal
set wildmenu " Habilita o menu
" set wrapmargin=8 " Número de caracteres à borda direita onde será inserido um caracter de nova linha caso ultrapasse

" ------------------------------------------------------------------------------
" Indentação {{{

set autoindent    " Indentação automática
set smartindent   " Indentação inteligente ao iniciar uma nova linha

set shiftround    " Arredonda os tabs para um múltiplo do shiftwidth
set smarttab      " Tab respeita o 'shiftwidth'
set noexpandtab     " Espaço em branco no lugar de tabs

set tabstop=4     " Tamanho visível de um tab
set shiftwidth=4  " Número de espaços usados na hora da indentação. Usado nos comandos cindent, >>, <<
set softtabstop=4 " Edita como se os espaços em branco fossem tabs de tamanho de 4 caracteres

set breakindent   " Linhas quebradas continuam indentadas visualmente
set copyindent    " Copia as linhas com indentação

" }}}
" ------------------------------------------------------------------------------

" ------------------------------------------------------------------------------
" Configurações de folding {{{1

set nofoldenable       " Desabilita o folding por padrão
set foldmethod=indent  " Método padrão do fold é indentação
set foldmarker={{{,}}} " Marcadores do fold
set foldclose=all      " Permite o folding automaticamente quando não está no cursor ou o nível é maior do que o folding level
set foldlevelstart=10  " Abrir o maior fold por padrão
set foldnestmax=10     " Nível máximo de folding aninhado
set foldcolumn=3       " Número de colunas para mostrar o folding

" }}}
" ------------------------------------------------------------------------------

" ------------------------------------------------------------------------------
" Barra de status {{{1
" set laststatus=2
" set statusline=%#CursorColumn#%{fugitive#statusline()}%#LineNr#\ %f%m%r%=%#CursorColumn#\ %y\ %{&fileencoding?&fileencoding:&encoding}\[%{&fileformat}\]\ %p%%\ %l:%c
" Esquemas customatizados {{{1

highlight SpecialKey cterm=none ctermfg=green guifg=Green

" Faz tabs e outros caracteres não-texto menos chatos
highlight SpecialKey ctermbg=none ctermfg=8
highlight NonText ctermbg=none ctermfg=8

" Comentários e atributos HTML sempre em itálico
highlight Comment cterm=italic
highlight htmlArg cterm=italic
highlight xmlAttrib cterm=italic

" Remover cor de fundo
highlight Normal ctermbg=none
highlight FoldColumn ctermbg=none

highlight EndOfBuffer guifg=bg guibg=NONE
highlight ErrorSign guibg=#3c3836 guifg=#fb4934
highlight WarningSign guibg=#3c3836 guifg=#fabd2f
highlight InfoSign guibg=#3c3836 guifg=#8ec07c
highlight Search guifg=#282a2e
highlight IncSearch guifg=#282a2e
highlight Child guifg=#fb4934 guibg=NONE cterm=bold gui=bold

" Destaca conflitos do git
match ErrorMsg '^\(<\|=\|>\)\{7\}\([^=].\+\)\?$'

" ------------------------------------------------------------------------------
" Mapeamento {{{1

let mapleader = "," " O padrão é \, mas é mais fácil digitar o vírgula
let g:mapleader = "," " Usado para os scripts

" Desabilitar as setinhas
noremap <left>  <nop>
noremap <right> <nop>
noremap <up>    <nop>
noremap <down>  <nop>
inoremap <left>  <nop>
inoremap <right> <nop>
inoremap <up>    <nop>
inoremap <down>  <nop>

" Alternar abas via tab no modo normal
nnoremap <tab> gt

" Alterna a numeração das linhas para relativo
nnoremap <leader>tn :set relativenumber!<cr>

" Alterna o modo de colar
nnoremap <leader>tp :set paste!<cr>

" Alterna o modo de indentação
nnoremap <leader>tf :set foldenable!<cr>

" Alterna entre mostrar ou não a linha onde o cursor está
nnoremap <leader>tc :set cursorline!<cr>

nnoremap <leader>sa :w<cr>

" Mover através das linhas visíveis, não das linhas numeradas
noremap j gj
noremap k gk

" Os blocos selecionados continuam selecionados depois de indentar
vnoremap > >gv
vnoremap < <gv

" Fechar o buffer atual
nmap <silent> <space>b :bw<cr>

" Voltar para o modo normal com jw
inoremap jw <esc>
if has('nvim')
  tnoremap <Esc> <C-\><C-n>
endif

" Desabilita o esc para sair do modo de inserção, forçando o uso do jk
inoremap <esc> <nop>

" Editar este arquivo
nnoremap <leader>ev :tabedit $MYVIMRC<cr>

" Limpar pesquisas feitas
nnoremap <space> :nohlsearch<cr>

" Remover espaços em branco (trailing spaces)
nnoremap <leader><space> :%s/\s\+$<cr>

" Remover linhas extras
nnoremap <leader><space><space> :%s/\n\{2,}/\r\r/g<cr>

" Alternar entre exibir ou não os símbolos
nnoremap <leader>l :set list!<cr>

" Indentação estilo textmate
vnoremap <leader>[ <gv
vnoremap <leader>] >gv
nnoremap <leader>[ <<
nnoremap <leader>] >>

" Alterar entre as janelas (não tabs)
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
if has('nvim')
  tnoremap <M-h> <C-\><C-n><C-w>h
  tnoremap <M-j> <C-\><C-n><C-w>j
  tnoremap <M-k> <C-\><C-n><C-w>k
  tnoremap <M-l> <C-\><C-n><C-w>l
endif

" Alternar entre o buffer atual e o anterior
nnoremap <leader>. <c-^>

" Abrir tags em uma nova aba
nnoremap <silent> <leader><C-]> <C-W><C-]><C-W>T

" Possibilita ordernar por comprimento da linha
vnoremap <leader>su !awk '{ print length(), $0 \| "sort -n \| cut -d\\  -f2-" }'<cr>

" ------------------------------------------------------------------------------
" Plugins {{{1

" ------------------------------------------------------------------------------
" Mapeamento para plugins {{{2

nnoremap <silent> <leader>k :NERDTreeToggle<cr>
nnoremap <silent> <leader>y :NERDTreeFind<cr>
nnoremap <leader>f :FZF<cr>
imap <expr> <tab> emmet#expandAbbrIntelligent("\<tab>")

" Inicia interativamente o EasyAlign no modo visual (e.g. vipga)
xmap ga <Plug>(EasyAlign)

" Inicia interativamente o EasyAlign para um texto ou objeto movimentação (e.g. gaip)
nmap ga <Plug>(EasyAlign)

" }}}
" ------------------------------------------------------------------------------

" ------------------------------------------------------------------------------
" Variáveis de plugins {{{2

let g:user_emmet_install_global = 0
let NERDTreeShowHidden=1
let NERDTreeChDirMode=2
let NERDTreeHijackNetrw=0
let NERDTreeQuitOnOpen=1
let g:airline_theme='papercolor'
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1

" }}}
" ------------------------------------------------------------------------------

" }}}
" ------------------------------------------------------------------------------

" ------------------------------------------------------------------------------
" Configurações automáticas baseado em eventos {{{

augroup configgroup
    autocmd!

    " Automatically deletes all trailing whitespace on save
    autocmd BufWritePre * %s/\s\+$//e

    autocmd BufWritePost .vimrc,.vimrc.local,init.vim,plugins.vim,ginit.vim source %

    " Disables automatic commenting on newline
    autocmd FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o

    autocmd VimResized * exe 'normal! \<c-w>='
    autocmd FileType vim setlocal fen fdm=marker

    autocmd FileType blade,html,css EmmetInstall
    autocmd FileType c nnoremap <silent> <space>b :!cc -Wall % -o %:r && ./%:r<CR>
    autocmd FileType cpp nnoremap <silent> <space>b :!g++ -Wall % -o %:r && ./%:r<CR>

    autocmd FocusLost * silent! wa
augroup END

augroup CustomColors
  autocmd!

  " Para Gotham
  autocmd ColorScheme gotham
    \ highlight Folded ctermbg=green ctermfg=blue
    \ | highlight VertSplit ctermfg=4 ctermbg=10
augroup END

" }}}
" ------------------------------------------------------------------------------

" vim: fen fdm=marker
